#Romlige forskjeller i næringsstruktur, virkninger av eksogene sjokk i basissysselsettingen, og lokale forskjeller I sysselsettingsvekst.

I denne oppgaven vil vi se pĂ¥ næringsstrukturer pĂ¥ Haugalandet, Sunnhordland og Hardanger.

Problemstillinger og beregninger vi vil se nærmere pĂ¥

Oversikt over befolkningene i regionene

Haugalandet

Haugalandet bestĂ¥r av kommunene Bokn (852), Haugesund (37357), Karmøy (42186), Sauda (4595), Tysvær(11065), Utsira(198) og Vindafjord(8714). tilsammen bor det 104967 personer i denne regionen. i tidsperioden vi har hentet inn data har det vert kommunesammenslĂ¥ing i denne regionen. Da ble Ă˜len og vindafjord slĂ¥tt i sammen til en kommune (hvordan har vi tatt hensyn til dette???)

Sunnhordland og Ullensvang

Sunnhordland og Ullensvang bestĂ¥r av kommunene Bømlo(11957), Etne(4062), Fitjar(3189), Kvinnherad(13071), Stord(18759), Sveio(5766), Tysnes(2869) og Ullensvang(11048). Tilsammen bor det 70721 personer i denne regionen.

Tallene er hentet fra SSB 09.01.21 (https://www.ssb.no/statbank/table/01223/tableViewLayout1/) gjelder for 4 kvartal 2020.

<<<<<<< HEAD
syssel_arb <- read_csv("Data/syssel_arb.csv", show_col_types = FALSE)
hld_arb <- read_csv("Data/hld_arb.csv", show_col_types = FALSE)
sun_arb <- read_csv("Data/sun_arb.csv", show_col_types = FALSE)
har_arb <- read_csv("Data/har_arb.csv", show_col_types = FALSE)
syssel_bos <- read_csv("Data/syssel_bos.csv", show_col_types = FALSE)
hld_bos <- read_csv("Data/hld_bos.csv", show_col_types = FALSE)
sun_bos <- read_csv("Data/sun_bos.csv", show_col_types = FALSE)
har_bos <- read_csv("Data/har_bos.csv", show_col_types = FALSE)
Pendling <- read_csv("Data/Pendling.csv", show_col_types = FALSE)
hgl_Pendling <- read_csv("Data/hgl_Pendling.csv", show_col_types = FALSE)
sun_Pendling <- read_csv("Data/sun_Pendling.csv", show_col_types = FALSE)

1 Sysselsetting I Ulike Næringer, Etter Arbeidssted (Modeller Ferdig??)

Haugalandet

hld_arb %>% 
  ggplot(mapping = aes(x = Ă…r, y = Totalt)) +
  geom_line() +
  labs(title = "Haugalandet")+
  ylab("Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
syssel_arb %>% 
  filter(knr %in% c(1106, 1135, 1145, 1146, 1149, 1151, 1160)) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = `Alle Næringer`, (angle=0))) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  labs(title = "Haugalandet", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  theme(legend.position = 'bottom')
hld_arb_long <- syssel_arb %>%
  pivot_longer(
    cols = `Jordbruk, Skogbrug og Fiske`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
=======

1 Sysselsetting I Ulike Næringer, Etter Arbeidssted (Modeller Ferdig??)

Haugalandet

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
# Ola: Skal vi ta vekk denne, Kevin? - SjĂ¥ dei to kode-chunkane under, og vurder

# Kevin: Hei! Vurderer om denne mĂ¥ gjøres pĂ¥ bĂ¥de Sunnhordland, samt Hardanger.

hld_arb_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Haugalandet
  filter(knavn %in% c("Bokn", "Haugesund", "Karmøy", "Sauda", "Tysvær", "Utsira", "Vindafjord")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(x = "Ă…r", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ tre kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'right')
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
hld_arb_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Haugalandet
  filter(knavn %in% c("Haugesund", "Karmøy", "Vindafjord")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Haugalandet: Haugesund, Karmøy og Vindafjord", x = "År", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ tre kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')
======= >>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
hld_arb_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Haugalandet
  filter(knavn %in% c("Bokn", "Sauda", "Tysvær", "Utsira")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Haugalandet: Bokn, Sauda, Tysvær og Utsira", x = "År", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ 4 kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 4) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')
=======
Warning: Removed 1 row(s) containing missing values (geom_path).

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 1106) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Haugesund", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(20852, 22190), xlim = c())
=======
Warning: Removed 1 row(s) containing missing values (geom_path).

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 1135) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Sauda", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(1937, 2180), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 1145) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Bokn", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+ 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(291, 327), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 1146) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Tysvær", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+ 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(4048, 4773), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 1149) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Karmøy", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+ 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(14591, 16059), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 1151) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Utsira", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+ 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(88, 114), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 1160) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Vindafjord", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+ 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(4422, 5037), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257

Sunnhordland

SĂ¥ gjer vi det samme for Sunnhordland

<<<<<<< HEAD
sun_arb %>% 
  ggplot(mapping = aes(x = Ă…r, y = Totalt)) +
  geom_line() +
  labs(title = "Sunnhordaland", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+ 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>% 
  filter(knr %in% c(4611, 4612, 4613, 4614, 4615, 4616, 4617)) %>% 
  ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
   labs(title = "Sunnhordland", x = "Ă…r") +
  theme(legend.position = 'bottom')
sun_arb_long <- syssel_arb %>%
  pivot_longer(
    cols = `Jordbruk, Skogbrug og Fiske`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
sun_arb_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Sunnhordland
  filter(knavn %in% c("Bømlo", "Stord", "Kvinnherad")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Sunnhordland: Bømlo, Kvinnherad og Stord", x = "År", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ tre kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')
======= >>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
sun_arb_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Sunnhordland
  filter(knavn %in% c("Etne", "Sveio", "Fitjar", "Tysnes")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Sunnhordland: Etne, Fitjar, Sveio og Tysnes", x = "Ă…r", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ tre kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 4) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 4611) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Etne", x = "Ă…r") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(1613, 1775), xlim = c())
=======
Warning: Removed 1 row(s) containing missing values (geom_path).

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 4612) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Sveio", x = "Ă…r") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(1357, 1523), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 4613) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Bømlo", x = "År") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(4662, 4890), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 4614) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Stord", x = "Ă…r") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(9161, 9938), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 4615) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Fitjar", x = "Ă…r") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(1085, 1259), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 4616) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Tysnes", x = "Ă…r") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(989, 1188), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
syssel_arb %>%
  filter(knr == 4617) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Kvinnherad", x = "Ă…r") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(5472, 6084), xlim = c())
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257

Hardanger

Til slutt mĂ¥ vi gjere det samme med Hardanger

<<<<<<< HEAD
har_arb %>% 
  ggplot(mapping = aes(x = Ă…r, y = Totalt)) +
  geom_line() +
  labs(title = "Hardanger", y= "Alle Næringer") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
syssel_arb %>% 
  filter(knr %in% c(4618, 1228)) %>% 
  ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_color_manual(values=c('#111111','#054987')) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
   labs(title = "Hardanger", x = "Ă…r") +
  theme(legend.position = 'bottom')
har_arb_long <- syssel_arb %>%
  pivot_longer(
    cols = `Jordbruk, Skogbrug og Fiske`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
har_arb_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Hardanger
  filter(knavn %in% c("Odda", "Ullensvang")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Hardanger: Odda, Ullensvang", x = "Ă…r", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ tre kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')
syssel_arb %>%
  filter(knr == 1228) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Odda", x = "Ă…r") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(3489, 3740), xlim = c())
syssel_arb %>%
  filter(knr == 4618) %>%
 ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Ullensvang", x = "Ă…r") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
  coord_cartesian(ylim = c(1235, 5291), xlim = c())

3 Sysselsetting I Ulike Næringer, Etter Bosted (Modeller Under Arbeid)

Haugalandet

hld_bos %>% 
  ggplot(mapping = aes(x = Ă…r, y = Totalt)) +
  geom_line() +
  labs(title = "Haugalandet")+
  ylab("Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
syssel_bos %>% 
  filter(knr %in% c(1106, 1135, 1145, 1146, 1149, 1151, 1160)) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = `Alle Næringer`, (angle=0))) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  labs(title = "Haugalandet", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  theme(legend.position = 'bottom')
hld_bos_long <- syssel_bos %>%
  pivot_longer(
    cols = `Jordbruk, Skogbrug og Fiske`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
hld_bos_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Haugalandet
  filter(knavn %in% c("Haugesund", "Karmøy", "Vindafjord")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Haugalandet: Haugesund, Karmøy og Vindafjord", x = "År", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ tre kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')
hld_bos_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Haugalandet
  filter(knavn %in% c("Bokn", "Sauda", "Tysvær", "Utsira")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Haugalandet: Bokn, Sauda, Tysvær og Utsira", x = "År", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ 4 kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 4) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')

Sunnhordland

sun_bos %>% 
  ggplot(mapping = aes(x = Ă…r, y = Totalt)) +
  geom_line() +
  labs(title = "Sunnhordaland", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+ 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
syssel_bos %>% 
  filter(knr %in% c(4611, 4612, 4613, 4614, 4615, 4616, 4617)) %>% 
  ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
   labs(title = "Sunnhordland", x = "Ă…r") +
  theme(legend.position = 'bottom')
=======

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
sun_bos_long <- syssel_bos %>%
  pivot_longer(
    cols = `Jordbruk, Skogbrug og Fiske`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
=======
Scale for 'colour' is already present. Adding another scale for 'colour', which will
replace the existing scale.

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
sun_bos_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Sunnhordland
  filter(knavn %in% c("Bømlo", "Stord", "Kvinnherad")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Sunnhordland: Bømlo, Kvinnherad og Stord", x = "År", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ tre kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')
sun_bos_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Sunnhordland
  filter(knavn %in% c("Etne", "Sveio", "Fitjar", "Tysnes")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Sunnhordland: Etne, Fitjar, Sveio og Tysnes", x = "Ă…r", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ tre kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 4) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')

Hardanger

har_bos %>% 
  ggplot(mapping = aes(x = Ă…r, y = Totalt)) +
  geom_line() +
  labs(title = "Hardanger", y= "Alle Næringer") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
syssel_bos %>% 
  filter(knr %in% c(4618, 1228)) %>% 
  ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_color_manual(values=c('#111111','#054987')) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
   labs(title = "Hardanger", x = "Ă…r") +
  theme(legend.position = 'bottom')
har_bos_long <- syssel_bos %>%
  pivot_longer(
    cols = `Jordbruk, Skogbrug og Fiske`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
har_bos_long %>% 
  # Vi ønsker Ă¥ studere alle kommunene som formelt sett regnes som Hardanger
  filter(knavn %in% c("Odda", "Ullensvang")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  
  # Vi omformaterer datoene til mer formĂ¥lstjenlige format
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  
  # Vi velger hvilken fargeoppslagstabell som skal anvendes
  scale_color_viridis(discrete = TRUE, option = "A") +
  # Angir aksetitler
  labs(title = "Hardanger: Odda, Ullensvang", x = "Ă…r", y = "Antall ansatte") +
  # Angir hvilke variabler fargene skal basere seg pĂ¥
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  
  # Lager et panel som viser flere grafer, fordelt pĂ¥ tre kolonner
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  
  # Bestemmer at forklaringene skal stĂ¥ pĂ¥ høyre side
  theme(legend.position = 'bottom')

Oppgave 4

hgl_Pendling
======= >>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257 <<<<<<< HEAD
sun_Pendling
=======
Warning: Removed 1 row(s) containing missing values (geom_path).

3 Sysselsetting I Ulike Næringer, Etter Bosted (Modeller Under Arbeid)

Haugalandet

Sunnhordland

Hardanger

Scale for 'colour' is already present. Adding another scale for 'colour', which will
replace the existing scale.

>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257
<<<<<<< HEAD
# Siste
======= >>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257
<<<<<<< HEAD
LS0tDQp0aXRsZTogIkFyYmVpZHNrcmF2IHbDpXJlbiAyMDIyIg0KYXV0aG9yOg0KLSBLZXZpbiBIYQ0KLSBPbGEgQW5kcmUgT2xvZnNzb24NCi0gQW5uIEVsaXNhYmV0aCBKYWNvYnNlbg0KLSBIZWlkaSBNYXJpZSBSb2xmc25lcw0Kc3VidGl0bGU6IE1TQjEwNiwgQW52ZW5kdCBieS0gb2cgcmVnaW9uYWzDuGtvbm9taQ0Kb3V0cHV0Og0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KbGFuZzogbm8tTkINCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IHNlbnRlbmNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoew0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0pDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgaW5jbHVkZSA9IFRSVUUpDQpgYGANCg0KI1JvbWxpZ2UgZm9yc2tqZWxsZXIgaSBuw6ZyaW5nc3N0cnVrdHVyLCB2aXJrbmluZ2VyIGF2IGVrc29nZW5lIHNqb2trIGkgYmFzaXNzeXNzZWxzZXR0aW5nZW4sIG9nIGxva2FsZSBmb3Jza2plbGxlciBJIHN5c3NlbHNldHRpbmdzdmVrc3QuDQoNCkkgZGVubmUgb3BwZ2F2ZW4gdmlsIHZpIHNlIHDDpSBuw6ZyaW5nc3N0cnVrdHVyZXIgcMOlIEhhdWdhbGFuZGV0LCBTdW5uaG9yZGxhbmQgb2cgSGFyZGFuZ2VyLg0KDQpQcm9ibGVtc3RpbGxpbmdlciBvZyBiZXJlZ25pbmdlciB2aSB2aWwgc2UgbsOmcm1lcmUgcMOlDQoNCi0gICBCZXNrcml2ZSBzaXR1YXNqb25lbiBzbGlrIGRlbiBlciBmb3IgMjAyMCwgb2cgZm9yIHV0dmlrbGluZ2VuIG92ZXIgdGlkLg0KLSAgIFN5c3NlbHNldHRpbmdzdXR2aWtsaW5nZW4gZm9yIHVsaWtlIG7DpnJpbmdlciBpIHVsaWtlIGtvbW11bmVyIG9nIGZvciByZWdpb25lbiBzYW1sZXQuDQotICAgQW5kZWxlbiBhdiBzeXNzZWxzZXR0aW5nZW4gaW5uZW5mb3IgZW5rZWx0bsOmcmluZ2VyLCBvZyBzYW1tZW5saWduZSBzaXR1YXNqb25lbiBvZyB1dHZpa2xpbmdlbiBmb3IgbG9rYWxlIGtvbW11bmVyIG9nIGxva2FsIHJlZ2lvbiBtZWQgZGV0IHNvbSBnamVsZGVyIGZvciBuYXNqb25lbiBzYW1sZXQuDQotICAgQmVyZWduZSBsb2thbGlzZXJpbmdza3ZvdGllbnRlciBmb3IgdWxpa2UgbsOmcmluZ2VyIGkgdWxpa2Uga29tbXVuZXIsIG9nIGZvciByZWdpb25lbihlKSBzYW1sZXQuDQotICAgQmVyZWduZSB1bGlrZSBhZ2dyZWdlcmluZ3NuaXbDpWVyIGF2IG7DpnJpbmdlciBvZyBnZW9ncmFmaSwgaWRlbnRpZmlzZXIgbXVsaWdlIGtseW5nZXIgYmFzZXJ0IHDDpSB2ZXJkaWVuZSBmb3IgbG9rYWxpc2VyaW5nc2t2b3RpZW50ZW5lLg0KLSAgIEdqw7hyZSBlbiB2dXJkZXJpbmcgYXYgaHZvciBrb25zZW50cmVydC9zcHJlZHQgZW4gbsOmcmluZyBlciBmb3JkZWx0IG1lbGxvbSBrb21tdW5lbmUgaSByZWdpb25lbiwgYmFzZXJ0IHDDpSBiZXJlZ25pbmdlciBhdiBkZW4gcm9tbGlnZSBHaW5pLWluZGVrc2VuLg0KLSAgIFZ1cmRlcmUgb20gc2FtbWVubGlnbmluZ3NncnVubmxhZ2V0IGLDuHIgdsOmcmUgc2FtbGV0IHN5c3NlbHNldHRpbmcgaSByZWdpb25lbiwgZWxsZXIgc2FtbGV0IHN5c3NlbHNldHRpbmcgYXYgbmFzam9uZW4sIG9nIGZpbm5lIHV0IGh2aWxrZW4gcm9sbGUgZGV0IHNwaWxsZXIgb20gZW4gYnJ1a2VyIHJlZ2lvbmFsZSBlbGxlciBuYXNqb25hbGUgYW5zbGFnIGZvciBzYW1sZXQgc3lzc2Vsc2V0dGluZy4NCi0gICBGaW5uZSB1dCBvbSBuw6ZyaW5nc3N0cnVrdHVyZW4gaSByZWdpb25lbiBoYXIgYmxpdHQgbWVyIGVsbGVyIG1pbmRyZSBkaXZlcnNpZmlzZXJ0LCBtYW5nZm9sZGlnLCBvdmVyIHRpZC4NCi0gICBCZXJlZ25lIGVuIHJlZ2lvbmFsIG1hbmdmb2xkLWluZGVrcyBvZyBmaW5uZSB1dCBodm9yZGFuIHZlcmRpZW5lIHDDpSBlbiBzbGlrIGluZGVrcyBlciBlbmRyZXQgb3ZlciB0aWQuDQotICAgVnVyZGVyZSBvbSBzeXNzZWxzZXR0aW5nc2FuZGVsZW5lIHNrYWwgc2FtbWVubGlnbmVzIG1lZCBuYXNqb25hbGUgZWxsZXIgcmVnaW9uYWxlIGFuZGVsZXIgZm9yIGRlIHVsaWtlIG7DpnJpbmdlbmUNCi0gICBHamVudGEgYmVyZWduaW5nZXIgZm9yIGFuZGVsZXIgYXYgYXJiZWlkc3Rha2VyZSBpIHVsaWtlIG7DpnJpbmdlciwgbG9rYWxpc2VyaW5nc2t2b3RpZW50ZXIsIGRlbiByb21saWdlIEdpbmktIGtvZWZmaXNpZW50ZW4gb2cgbcOlbGV0IGZvciBtYW5nZm9sZCBhdiBuw6ZyaW5nZXIsIG1lZCB1dGdhbmdzcHVua3QgaSBkYXRhIHNwZXNpZmlzZXJ0IGV0dGVyIGFyYmVpZHN0YWtlcm5lcyBib3N0ZWQuDQotICAgU2FtbWVubGlnbmUgcmVzdWx0YXRlbmUgZm9yIGRhdGEgZXR0ZXIgYXJiZWlkc3N0ZWQsIG9nIGtvbW1lbnRlciBodmlsa2VuIGluZm9ybWFzam9uIHJlc3VsdGF0ZW5lIGdpciBvbSByb21saWcgbW9iaWxpdGV0IGkgYXJiZWlkc21hcmtlZGV0Lg0KLSAgIEdpIGVuIGtvcnQgb3ZlcnNpa3Qgb3ZlciBwZW5kbGVyc3Ryw7htbWVyIG1lbGxvbSBrb21tdW5lbmUgaSByZWdpb25lbg0KLSAgIEJlcmVnbmUgb2cgcHJlc2VudGVyZSBhbmRlbGVyIGF2IGFyYmVpZHN0YWtlcmUgbWVkIGJvc3RlZCBpIGVuIGtvbW11bmUgc29tIGhhciBhcmJlaWRzc3RlZCBpIGFuZHJlIGtvbW11bmVyLCBvZyBnasO4ciBkZXQgc2FtbWUgZm9yIGFuZGVsZW4gYXYgam9iYmVuZSBpIGVuIGtvbW11bmUgc29tIGVyIGJlc2F0dCBhdiBhcmJlaWRzdGFrZXJlIGZyYSBhbmRyZSBrb21tdW5lci4NCi0gICBEaXNrdXRlcmUgZm9yc2tqZWxsZXIgbWVsbG9tIGtvbW11bmVuZSBpIHJlZ2lvbmVuLCBvZyBkcsO4ZnQgdXR2aWtsaW5nZW4gb3ZlciB0aWQgZm9yIHVsaWtlIGtvbW11bmVyDQotICAgQmVyZWduZSBvZyBwcmVzZW50ZXJlIGFuZGVsZW4gYXYgYXJiZWlkc3Rha2VyZSBzb20gYm9yIG9nIGpvYmJlciBpbm5lbmZvciBzYW1tZSBrb21tdW5lLiBTZSBvbSBkZXQgZXIgc3lzdGVtYXRpc2tlIGZvcnNramVsbGVyIHNldHQgaSBmb3Job2xkIHRpbCBzZW50cmFsaXRldCBvZyB0aWxnamVuZ2VsaWdoZXQgaSBkZXQgbG9rYWxlIGFyYmVpZHNtYXJrZWRldC4gT2cgb20gZGV0IGVyIGJlc3RlbXRlIHRyZW5kZXIgaSB1dHZpa2xpbmdlbiBmb3IgdWxpa2Uga29tbXVuZXIuDQotICAgQnJ1a2UgYmVyZWduaW5nZW5lIGF2IGxva2FsaXNlcmluZ2t2b3RpZW50ZXIgdGlsIMOlIGRlbGUgbsOmcmluZ2VuZSBpbm4gaSBsb2thbC0gb2cgYmFzaXNuw6ZyaW5nZXINCi0gICBGb3JtdWxlcmUgZW4gw7hrb25vbWlzayBiYXNlbW9kZWxsIG9nIGJlcmVnbmUgw7hrb25vbWlza2UgYmFzZW11bGlwbGlrYXRvcmVyIGZvciBlbmtlbHRrb21tdW5lciBvZyByZWdpb24oZXIpLg0KLSAgIFZ1cmRlcmUgbG9rYWxlIHZpcmtuaW5nZXIgYXYgYWx0ZXJuYXRpdmUgbG9rYWxpc2VyaW5nZXIgaSBPZGRhLCBIdXNuZXMgb2cgTGVpcnZpaw0KLSAgIERyw7hmdGUgdmlya25pbmdlciBhdiBldCBzbGlrdCBwb3NpdGl2dCBla3NvZ2VudCBzam9rayBmb3IgZGVuIGxva2FsZSDDuGtvbm9taWVuIGdqZW5ub20gYnJ1ayBhdiBlbiBiYXNlbW9kZWxsDQotICAgRmlubmUgdXQgaHZvcmRhbiB2aXJrbmluZ2VuZSBldmVudHVlbHQgc3ByZXMgdGlsIGFuZHJlIGtvbW11bmVyIGkgcmVnaW9uZW4gb2cgaHZvcmRhbiBlbiBrYW4gYnJ1a2UgZGF0YSBmb3IgcGVuZGxlc3Ryw7htbWVyIHRpbCDDpSBwcmVkaWtlcmUgdmlya25pbmdlciBww6Ugc3lzc2Vsc2V0dGluZ2VuIGkgdWxpa2Uga29tbXVuZXIuDQotICAgU2FtbWVubGlnbmUgZGlzc2UgcHJlZGlrc2pvbmVuZSBtZWQgZGUgdmkgZsOlciBuw6VyIHZpIGdqZW5ub21mw7hyZXIgYW5hbHlzZW4gcMOlIHJlZ2lvbmFsdCBuaXbDpS4NCi0gICBHaSBlbiBzaGlmdC1zaGFyZSBhbmFseXNlIGkgZW4gZGlza3Vzam9uIGF2IGZvcnNramVsbGVyIGkgdmVrc3QgZm9yIGVrc2VtcGVsIG1lbGxvbSBpbmRyZSwgbWlkdHJlIG9nIHl0cmUgZGVsZXIgYXYgcmVnaW9uZW4sIGVsbGVyIGV2ZW50dWVsdCBvbXLDpWRlci9rb21tdW5lciBzb20gaGFyIGhhdHQgc3Rlcmsgb2cgc3ZhayBiZWZvbGtuaW5nc3V0dmlrbGluZy4NCg0KIyMgT3ZlcnNpa3Qgb3ZlciBiZWZvbGtuaW5nZW5lIGkgcmVnaW9uZW5lDQoNCiMjIyBIYXVnYWxhbmRldA0KSGF1Z2FsYW5kZXQgYmVzdMOlciBhdiBrb21tdW5lbmUgQm9rbiAoODUyKSwgSGF1Z2VzdW5kICgzNzM1NyksIEthcm3DuHkgKDQyMTg2KSwgU2F1ZGEgKDQ1OTUpLCBUeXN2w6ZyKDExMDY1KSwgVXRzaXJhKDE5OCkgb2cgVmluZGFmam9yZCg4NzE0KS4gdGlsc2FtbWVuIGJvciBkZXQgMTA0OTY3IHBlcnNvbmVyIGkgZGVubmUgcmVnaW9uZW4uIGkgdGlkc3BlcmlvZGVuIHZpIGhhciBoZW50ZXQgaW5uIGRhdGEgaGFyIGRldCB2ZXJ0IGtvbW11bmVzYW1tZW5zbMOlaW5nIGkgZGVubmUgcmVnaW9uZW4uIERhIGJsZSDDmGxlbiBvZyB2aW5kYWZqb3JkIHNsw6V0dCBpIHNhbW1lbiB0aWwgZW4ga29tbXVuZSAoaHZvcmRhbiBoYXIgdmkgdGF0dCBoZW5zeW4gdGlsIGRldHRlPz8/KQ0KDQojIyMgU3VubmhvcmRsYW5kIG9nIFVsbGVuc3ZhbmcNClN1bm5ob3JkbGFuZCBvZyBVbGxlbnN2YW5nIGJlc3TDpXIgYXYga29tbXVuZW5lIELDuG1sbygxMTk1NyksIEV0bmUoNDA2MiksIEZpdGphcigzMTg5KSwgS3Zpbm5oZXJhZCgxMzA3MSksIFN0b3JkKDE4NzU5KSwgU3ZlaW8oNTc2NiksIFR5c25lcygyODY5KSBvZyBVbGxlbnN2YW5nKDExMDQ4KS4gVGlsc2FtbWVuIGJvciBkZXQgNzA3MjEgcGVyc29uZXIgaSBkZW5uZSByZWdpb25lbi4NCg0KVGFsbGVuZSBlciBoZW50ZXQgZnJhIFNTQiAwOS4wMS4yMSAoaHR0cHM6Ly93d3cuc3NiLm5vL3N0YXRiYW5rL3RhYmxlLzAxMjIzL3RhYmxlVmlld0xheW91dDEvKSBnamVsZGVyIGZvciA0IGt2YXJ0YWwgMjAyMC4NCg0KYGBge3IgY3N2X2ZpbGVyfQ0Kc3lzc2VsX2FyYiA8LSByZWFkX2NzdigiRGF0YS9zeXNzZWxfYXJiLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpobGRfYXJiIDwtIHJlYWRfY3N2KCJEYXRhL2hsZF9hcmIuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCnN1bl9hcmIgPC0gcmVhZF9jc3YoIkRhdGEvc3VuX2FyYi5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQ0KaGFyX2FyYiA8LSByZWFkX2NzdigiRGF0YS9oYXJfYXJiLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpzeXNzZWxfYm9zIDwtIHJlYWRfY3N2KCJEYXRhL3N5c3NlbF9ib3MuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCmhsZF9ib3MgPC0gcmVhZF9jc3YoIkRhdGEvaGxkX2Jvcy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQ0Kc3VuX2JvcyA8LSByZWFkX2NzdigiRGF0YS9zdW5fYm9zLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpoYXJfYm9zIDwtIHJlYWRfY3N2KCJEYXRhL2hhcl9ib3MuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNClBlbmRsaW5nIDwtIHJlYWRfY3N2KCJEYXRhL1BlbmRsaW5nLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpoZ2xfUGVuZGxpbmcgPC0gcmVhZF9jc3YoIkRhdGEvaGdsX1BlbmRsaW5nLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpzdW5fUGVuZGxpbmcgPC0gcmVhZF9jc3YoIkRhdGEvc3VuX1BlbmRsaW5nLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpgYGANCg0KIyAxIFN5c3NlbHNldHRpbmcgSSBVbGlrZSBOw6ZyaW5nZXIsIEV0dGVyIEFyYmVpZHNzdGVkIChNb2RlbGxlciBGZXJkaWc/PykNCg0KIyMgSGF1Z2FsYW5kZXQNCg0KYGBge3IgQXJiZWlkc3N0ZWRfSGF1Z2FsYW5kZXRfMX0NCmhsZF9hcmIgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gw4VyLCB5ID0gVG90YWx0KSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiSGF1Z2FsYW5kZXQiKSsNCiAgeWxhYigiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkNCmBgYA0KDQpgYGB7ciBBcmJlaWRzc3RlZF9IYXVnYWxhbmRldF8yfQ0Kc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSBjKDExMDYsIDExMzUsIDExNDUsIDExNDYsIDExNDksIDExNTEsIDExNjApKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBgQWxsZSBOw6ZyaW5nZXJgLCAoYW5nbGU9MCkpKSArDQogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsNCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsNCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYyhzZXEoMi4wLCAyLCBieSA9IC0wLjEpKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArDQogIGxhYnModGl0bGUgPSAiSGF1Z2FsYW5kZXQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIGhsZF9hcmJfbG9uZ30NCmhsZF9hcmJfbG9uZyA8LSBzeXNzZWxfYXJiICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgOlVvcHBnaXR0LA0KICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLA0KICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZy0gb2cgdXR2aWtsaW5nIGkgSGF1Z2VsYW5kZXR9DQojIE9sYTogU2thbCB2aSB0YSB2ZWtrIGRlbm5lLCBLZXZpbj8gLSBTasOlIGRlaSB0byBrb2RlLWNodW5rYW5lIHVuZGVyLCBvZyB2dXJkZXINCg0KIyBLZXZpbjogSGVpISBWdXJkZXJlciBvbSBkZW5uZSBtw6UgZ2rDuHJlcyBww6UgYsOlZGUgU3VubmhvcmRsYW5kLCBzYW10IEhhcmRhbmdlci4NCg0KaGxkX2FyYl9sb25nICU+JSANCiAgIyBWaSDDuG5za2VyIMOlIHN0dWRlcmUgYWxsZSBrb21tdW5lbmUgc29tIGZvcm1lbHQgc2V0dCByZWduZXMgc29tIEhhdWdhbGFuZGV0DQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkJva24iLCAiSGF1Z2VzdW5kIiwgIkthcm3DuHkiLCAiU2F1ZGEiLCAiVHlzdsOmciIsICJVdHNpcmEiLCAiVmluZGFmam9yZCIpKSAlPiUgDQogIA0KICAjIFZpIG9tZm9ybWF0ZXJlciBkYXRvZW5lIHRpbCBtZXIgZm9ybcOlbHN0amVubGlnZSBmb3JtYXQNCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArDQogIA0KICAjIFZpIHZlbGdlciBodmlsa2VuIGZhcmdlb3Bwc2xhZ3N0YWJlbGwgc29tIHNrYWwgYW52ZW5kZXMNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICAjIEFuZ2lyIGFrc2V0aXRsZXINCiAgbGFicyh4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArDQogICMgQW5naXIgaHZpbGtlIHZhcmlhYmxlciBmYXJnZW5lIHNrYWwgYmFzZXJlIHNlZyBww6UNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICANCiAgIyBMYWdlciBldCBwYW5lbCBzb20gdmlzZXIgZmxlcmUgZ3JhZmVyLCBmb3JkZWx0IHDDpSB0cmUga29sb25uZXINCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsNCiAgDQogICMgQmVzdGVtbWVyIGF0IGZvcmtsYXJpbmdlbmUgc2thbCBzdMOlIHDDpSBow7h5cmUgc2lkZQ0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAncmlnaHQnKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19IYXVnZWxhbmRldF8zX1N0w7hyc3RlX0FyYmVpZHNzdGVkfQ0KaGxkX2FyYl9sb25nICU+JSANCiAgIyBWaSDDuG5za2VyIMOlIHN0dWRlcmUgYWxsZSBrb21tdW5lbmUgc29tIGZvcm1lbHQgc2V0dCByZWduZXMgc29tIEhhdWdhbGFuZGV0DQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkhhdWdlc3VuZCIsICJLYXJtw7h5IiwgIlZpbmRhZmpvcmQiKSkgJT4lIA0KICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgDQogIA0KICAjIFZpIG9tZm9ybWF0ZXJlciBkYXRvZW5lIHRpbCBtZXIgZm9ybcOlbHN0amVubGlnZSBmb3JtYXQNCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArDQogIA0KICAjIFZpIHZlbGdlciBodmlsa2VuIGZhcmdlb3Bwc2xhZ3N0YWJlbGwgc29tIHNrYWwgYW52ZW5kZXMNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICAjIEFuZ2lyIGFrc2V0aXRsZXINCiAgbGFicyh0aXRsZSA9ICJIYXVnYWxhbmRldDogSGF1Z2VzdW5kLCBLYXJtw7h5IG9nIFZpbmRhZmpvcmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArDQogICMgQW5naXIgaHZpbGtlIHZhcmlhYmxlciBmYXJnZW5lIHNrYWwgYmFzZXJlIHNlZyBww6UNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICANCiAgIyBMYWdlciBldCBwYW5lbCBzb20gdmlzZXIgZmxlcmUgZ3JhZmVyLCBmb3JkZWx0IHDDpSB0cmUga29sb25uZXINCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsNCiAgDQogICMgQmVzdGVtbWVyIGF0IGZvcmtsYXJpbmdlbmUgc2thbCBzdMOlIHDDpSBow7h5cmUgc2lkZQ0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGF1Z2VsYW5kZXRfNF9NaW5zdGVfQXJiZWlkc3N0ZWR9DQpobGRfYXJiX2xvbmcgJT4lIA0KICAjIFZpIMO4bnNrZXIgw6Ugc3R1ZGVyZSBhbGxlIGtvbW11bmVuZSBzb20gZm9ybWVsdCBzZXR0IHJlZ25lcyBzb20gSGF1Z2FsYW5kZXQNCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQm9rbiIsICJTYXVkYSIsICJUeXN2w6ZyIiwgIlV0c2lyYSIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSANCiAgDQogICMgVmkgb21mb3JtYXRlcmVyIGRhdG9lbmUgdGlsIG1lciBmb3Jtw6Vsc3RqZW5saWdlIGZvcm1hdA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgDQogICMgVmkgdmVsZ2VyIGh2aWxrZW4gZmFyZ2VvcHBzbGFnc3RhYmVsbCBzb20gc2thbCBhbnZlbmRlcw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogICMgQW5naXIgYWtzZXRpdGxlcg0KICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0OiBCb2tuLCBTYXVkYSwgVHlzdsOmciBvZyBVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArDQogICMgQW5naXIgaHZpbGtlIHZhcmlhYmxlciBmYXJnZW5lIHNrYWwgYmFzZXJlIHNlZyBww6UNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICANCiAgIyBMYWdlciBldCBwYW5lbCBzb20gdmlzZXIgZmxlcmUgZ3JhZmVyLCBmb3JkZWx0IHDDpSA0IGtvbG9ubmVyDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSA0KSArDQogIA0KICAjIEJlc3RlbW1lciBhdCBmb3JrbGFyaW5nZW5lIHNrYWwgc3TDpSBww6UgaMO4eXJlIHNpZGUNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpDQpgYGANCg0KYGBge3IgSGF1Z2VzdW5kfQ0Kc3lzc2VsX2FyYiAlPiUNCiAgZmlsdGVyKGtuciA9PSAxMTA2KSAlPiUNCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIkhhdWdlc3VuZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygyMDg1MiwgMjIxOTApLCB4bGltID0gYygpKQ0KYGBgDQoNCmBgYHtyIFNhdWRhfQ0Kc3lzc2VsX2FyYiAlPiUNCiAgZmlsdGVyKGtuciA9PSAxMTM1KSAlPiUNCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlNhdWRhIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIGkgIFxuIGFsbGUgbsOmcmluZ2VyIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDE5MzcsIDIxODApLCB4bGltID0gYygpKQ0KYGBgDQoNCmBgYHtyIEJva259DQpzeXNzZWxfYXJiICU+JQ0KICBmaWx0ZXIoa25yID09IDExNDUpICU+JQ0KIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiQm9rbiIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMjkxLCAzMjcpLCB4bGltID0gYygpKQ0KYGBgDQoNCmBgYHtyIFR5c3bDpnJ9DQpzeXNzZWxfYXJiICU+JQ0KICBmaWx0ZXIoa25yID09IDExNDYpICU+JQ0KIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiVHlzdsOmciIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoNDA0OCwgNDc3MyksIHhsaW0gPSBjKCkpDQpgYGANCg0KYGBge3IgS2FybcO4eX0NCnN5c3NlbF9hcmIgJT4lDQogIGZpbHRlcihrbnIgPT0gMTE0OSkgJT4lDQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJLYXJtw7h5IiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIGkgIFxuIGFsbGUgbsOmcmluZ2VyIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygxNDU5MSwgMTYwNTkpLCB4bGltID0gYygpKQ0KYGBgDQoNCmBgYHtyIFV0c2lyYX0NCnN5c3NlbF9hcmIgJT4lDQogIGZpbHRlcihrbnIgPT0gMTE1MSkgJT4lDQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDg4LCAxMTQpLCB4bGltID0gYygpKQ0KYGBgDQoNCmBgYHtyIFZpbmRhZmpvcmR9DQpzeXNzZWxfYXJiICU+JQ0KICBmaWx0ZXIoa25yID09IDExNjApICU+JQ0KIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiVmluZGFmam9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoNDQyMiwgNTAzNyksIHhsaW0gPSBjKCkpDQpgYGANCg0KIyMgU3VubmhvcmRsYW5kDQoNClPDpSBnamVyIHZpIGRldCBzYW1tZSBmb3IgKlN1bm5ob3JkbGFuZCoNCg0KYGBge3J9DQpzdW5fYXJiICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IFRvdGFsdCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkYWxhbmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpDQpgYGANCg0KYGBge3IgQXJiZWlkc3N0ZWRfU3VubmhvcmRsYW5kfQ0Kc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSBjKDQ2MTEsIDQ2MTIsIDQ2MTMsIDQ2MTQsIDQ2MTUsIDQ2MTYsIDQ2MTcpKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBrbmF2biwgY29sb3VyID0ga25hdm4pKSArDQogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsNCiAgIGxhYnModGl0bGUgPSAiU3VubmhvcmRsYW5kIiwgeCA9ICLDhXIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIHN1bl9hcmJfbG9uZ30NCnN1bl9hcmJfbG9uZyA8LSBzeXNzZWxfYXJiICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgOlVvcHBnaXR0LA0KICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLA0KICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfU3VubmhvcmRsYW5kXzNfU3TDuHJzdGVfQXJiZWlkc3N0ZWR9DQpzdW5fYXJiX2xvbmcgJT4lIA0KICAjIFZpIMO4bnNrZXIgw6Ugc3R1ZGVyZSBhbGxlIGtvbW11bmVuZSBzb20gZm9ybWVsdCBzZXR0IHJlZ25lcyBzb20gU3VubmhvcmRsYW5kDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkLDuG1sbyIsICJTdG9yZCIsICJLdmlubmhlcmFkIikpICU+JSANCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIA0KICANCiAgIyBWaSBvbWZvcm1hdGVyZXIgZGF0b2VuZSB0aWwgbWVyIGZvcm3DpWxzdGplbmxpZ2UgZm9ybWF0DQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKw0KICANCiAgIyBWaSB2ZWxnZXIgaHZpbGtlbiBmYXJnZW9wcHNsYWdzdGFiZWxsIHNvbSBza2FsIGFudmVuZGVzDQogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsNCiAgIyBBbmdpciBha3NldGl0bGVyDQogIGxhYnModGl0bGUgPSAiU3VubmhvcmRsYW5kOiBCw7htbG8sIEt2aW5uaGVyYWQgb2cgU3RvcmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArDQogICMgQW5naXIgaHZpbGtlIHZhcmlhYmxlciBmYXJnZW5lIHNrYWwgYmFzZXJlIHNlZyBww6UNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICANCiAgIyBMYWdlciBldCBwYW5lbCBzb20gdmlzZXIgZmxlcmUgZ3JhZmVyLCBmb3JkZWx0IHDDpSB0cmUga29sb25uZXINCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsNCiAgDQogICMgQmVzdGVtbWVyIGF0IGZvcmtsYXJpbmdlbmUgc2thbCBzdMOlIHDDpSBow7h5cmUgc2lkZQ0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfU3VubmhvcmRsYW5kXzRfTWluc3RlX0FyYmVpZHNzdGVkfQ0Kc3VuX2FyYl9sb25nICU+JSANCiAgIyBWaSDDuG5za2VyIMOlIHN0dWRlcmUgYWxsZSBrb21tdW5lbmUgc29tIGZvcm1lbHQgc2V0dCByZWduZXMgc29tIFN1bm5ob3JkbGFuZA0KICBmaWx0ZXIoa25hdm4gJWluJSBjKCJFdG5lIiwgIlN2ZWlvIiwgIkZpdGphciIsICJUeXNuZXMiKSkgJT4lIA0KICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgDQogIA0KICAjIFZpIG9tZm9ybWF0ZXJlciBkYXRvZW5lIHRpbCBtZXIgZm9ybcOlbHN0amVubGlnZSBmb3JtYXQNCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArDQogIA0KICAjIFZpIHZlbGdlciBodmlsa2VuIGZhcmdlb3Bwc2xhZ3N0YWJlbGwgc29tIHNrYWwgYW52ZW5kZXMNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICAjIEFuZ2lyIGFrc2V0aXRsZXINCiAgbGFicyh0aXRsZSA9ICJTdW5uaG9yZGxhbmQ6IEV0bmUsIEZpdGphciwgU3ZlaW8gb2cgVHlzbmVzIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICAjIEFuZ2lyIGh2aWxrZSB2YXJpYWJsZXIgZmFyZ2VuZSBza2FsIGJhc2VyZSBzZWcgcMOlDQogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsNCiAgDQogICMgTGFnZXIgZXQgcGFuZWwgc29tIHZpc2VyIGZsZXJlIGdyYWZlciwgZm9yZGVsdCBww6UgdHJlIGtvbG9ubmVyDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSA0KSArDQogIA0KICAjIEJlc3RlbW1lciBhdCBmb3JrbGFyaW5nZW5lIHNrYWwgc3TDpSBww6UgaMO4eXJlIHNpZGUNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpDQpgYGANCg0KYGBge3IgRXRuZX0NCnN5c3NlbF9hcmIgJT4lDQogIGZpbHRlcihrbnIgPT0gNDYxMSkgJT4lDQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJFdG5lIiwgeCA9ICLDhXIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDE2MTMsIDE3NzUpLCB4bGltID0gYygpKQ0KYGBgDQoNCmBgYHtyIFN2ZWlvfQ0Kc3lzc2VsX2FyYiAlPiUNCiAgZmlsdGVyKGtuciA9PSA0NjEyKSAlPiUNCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlN2ZWlvIiwgeCA9ICLDhXIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDEzNTcsIDE1MjMpLCB4bGltID0gYygpKQ0KYGBgDQoNCmBgYHtyIELDuG1sb30NCnN5c3NlbF9hcmIgJT4lDQogIGZpbHRlcihrbnIgPT0gNDYxMykgJT4lDQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJCw7htbG8iLCB4ID0gIsOFciIpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoNDY2MiwgNDg5MCksIHhsaW0gPSBjKCkpDQpgYGANCg0KYGBge3IgU3RvcmR9DQpzeXNzZWxfYXJiICU+JQ0KICBmaWx0ZXIoa25yID09IDQ2MTQpICU+JQ0KIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiU3RvcmQiLCB4ID0gIsOFciIpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoOTE2MSwgOTkzOCksIHhsaW0gPSBjKCkpDQpgYGANCg0KYGBge3IgRml0amFyfQ0Kc3lzc2VsX2FyYiAlPiUNCiAgZmlsdGVyKGtuciA9PSA0NjE1KSAlPiUNCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIkZpdGphciIsIHggPSAiw4VyIikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygxMDg1LCAxMjU5KSwgeGxpbSA9IGMoKSkNCmBgYA0KDQpgYGB7ciBUeXNuZXN9DQpzeXNzZWxfYXJiICU+JQ0KICBmaWx0ZXIoa25yID09IDQ2MTYpICU+JQ0KIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiVHlzbmVzIiwgeCA9ICLDhXIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDk4OSwgMTE4OCksIHhsaW0gPSBjKCkpDQpgYGANCg0KYGBge3IgS3Zpbm5oZXJhZH0NCnN5c3NlbF9hcmIgJT4lDQogIGZpbHRlcihrbnIgPT0gNDYxNykgJT4lDQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJLdmlubmhlcmFkIiwgeCA9ICLDhXIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDU0NzIsIDYwODQpLCB4bGltID0gYygpKQ0KYGBgDQoNCiMjIEhhcmRhbmdlcg0KDQpUaWwgc2x1dHQgbcOlIHZpIGdqZXJlIGRldCBzYW1tZSBtZWQgKkhhcmRhbmdlcioNCg0KYGBge3IgQXJiZWlkc3N0ZWRfSGFyZGFuZ2VyXzF9DQpoYXJfYXJiICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IFRvdGFsdCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIkhhcmRhbmdlciIsIHk9ICJBbGxlIE7DpnJpbmdlciIpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkNCmBgYA0KDQpgYGB7ciBBcmJlaWRzc3RlZF9IYXJkYW5nZXJfMn0NCnN5c3NlbF9hcmIgJT4lIA0KICBmaWx0ZXIoa25yICVpbiUgYyg0NjE4LCAxMjI4KSkgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0ga25hdm4sIGNvbG91ciA9IGtuYXZuKSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyMxMTExMTEnLCcjMDU0OTg3JykpICsNCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYyhzZXEoMi4wLCAyLCBieSA9IC0wLjEpKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICAgbGFicyh0aXRsZSA9ICJIYXJkYW5nZXIiLCB4ID0gIsOFciIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpDQpgYGANCg0KYGBge3IgaGFyX2FyYl9sb25nfQ0KaGFyX2FyYl9sb25nIDwtIHN5c3NlbF9hcmIgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWA6VW9wcGdpdHQsDQogICAgbmFtZXNfdG8gPSAiTsOmcmluZyIsDQogICAgdmFsdWVzX3RvID0gIkFuc2F0dGUiKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19IYXJkYW5nZXJfQXJiZWlkc3N0ZWR9DQpoYXJfYXJiX2xvbmcgJT4lIA0KICAjIFZpIMO4bnNrZXIgw6Ugc3R1ZGVyZSBhbGxlIGtvbW11bmVuZSBzb20gZm9ybWVsdCBzZXR0IHJlZ25lcyBzb20gSGFyZGFuZ2VyDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIk9kZGEiLCAiVWxsZW5zdmFuZyIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSANCiAgDQogICMgVmkgb21mb3JtYXRlcmVyIGRhdG9lbmUgdGlsIG1lciBmb3Jtw6Vsc3RqZW5saWdlIGZvcm1hdA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgDQogICMgVmkgdmVsZ2VyIGh2aWxrZW4gZmFyZ2VvcHBzbGFnc3RhYmVsbCBzb20gc2thbCBhbnZlbmRlcw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogICMgQW5naXIgYWtzZXRpdGxlcg0KICBsYWJzKHRpdGxlID0gIkhhcmRhbmdlcjogT2RkYSwgVWxsZW5zdmFuZyIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgIyBBbmdpciBodmlsa2UgdmFyaWFibGVyIGZhcmdlbmUgc2thbCBiYXNlcmUgc2VnIHDDpQ0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIA0KICAjIExhZ2VyIGV0IHBhbmVsIHNvbSB2aXNlciBmbGVyZSBncmFmZXIsIGZvcmRlbHQgcMOlIHRyZSBrb2xvbm5lcg0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKw0KICANCiAgIyBCZXN0ZW1tZXIgYXQgZm9ya2xhcmluZ2VuZSBza2FsIHN0w6UgcMOlIGjDuHlyZSBzaWRlDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIE9kZGF9DQpzeXNzZWxfYXJiICU+JQ0KICBmaWx0ZXIoa25yID09IDEyMjgpICU+JQ0KIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiT2RkYSIsIHggPSAiw4VyIikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygzNDg5LCAzNzQwKSwgeGxpbSA9IGMoKSkNCmBgYA0KDQpgYGB7ciBVbGxlbnN2YW5nfQ0Kc3lzc2VsX2FyYiAlPiUNCiAgZmlsdGVyKGtuciA9PSA0NjE4KSAlPiUNCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlVsbGVuc3ZhbmciLCB4ID0gIsOFciIpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMTIzNSwgNTI5MSksIHhsaW0gPSBjKCkpDQpgYGANCg0KIyAzIFN5c3NlbHNldHRpbmcgSSBVbGlrZSBOw6ZyaW5nZXIsIEV0dGVyIEJvc3RlZCAoTW9kZWxsZXIgVW5kZXIgQXJiZWlkKQ0KDQojIyBIYXVnYWxhbmRldA0KDQpgYGB7ciBCb3N0ZWRfSGF1Z2FsYW5kZXRfMX0NCmhsZF9ib3MgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gw4VyLCB5ID0gVG90YWx0KSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiSGF1Z2FsYW5kZXQiKSsNCiAgeWxhYigiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkNCmBgYA0KDQpgYGB7ciBCb3N0ZWRfSGF1Z2FsYW5kZXRfMn0NCnN5c3NlbF9ib3MgJT4lIA0KICBmaWx0ZXIoa25yICVpbiUgYygxMTA2LCAxMTM1LCAxMTQ1LCAxMTQ2LCAxMTQ5LCAxMTUxLCAxMTYwKSkgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCwgKGFuZ2xlPTApKSkgKw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBrbmF2biwgY29sb3VyID0ga25hdm4pKSArDQogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKw0KICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0IiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIGkgIFxuIGFsbGUgbsOmcmluZ2VyIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBobGRfYm9zX2xvbmd9DQpobGRfYm9zX2xvbmcgPC0gc3lzc2VsX2JvcyAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYDpVb3BwZ2l0dCwNCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwNCiAgICB2YWx1ZXNfdG8gPSAiQW5zYXR0ZSIpDQpgYGANCg0KYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX0hhdWdlbGFuZGV0XzNfU3TDuHJzdGVfQm9zdGVkfQ0KaGxkX2Jvc19sb25nICU+JSANCiAgIyBWaSDDuG5za2VyIMOlIHN0dWRlcmUgYWxsZSBrb21tdW5lbmUgc29tIGZvcm1lbHQgc2V0dCByZWduZXMgc29tIEhhdWdhbGFuZGV0DQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkhhdWdlc3VuZCIsICJLYXJtw7h5IiwgIlZpbmRhZmpvcmQiKSkgJT4lIA0KICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgDQogIA0KICAjIFZpIG9tZm9ybWF0ZXJlciBkYXRvZW5lIHRpbCBtZXIgZm9ybcOlbHN0amVubGlnZSBmb3JtYXQNCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArDQogIA0KICAjIFZpIHZlbGdlciBodmlsa2VuIGZhcmdlb3Bwc2xhZ3N0YWJlbGwgc29tIHNrYWwgYW52ZW5kZXMNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICAjIEFuZ2lyIGFrc2V0aXRsZXINCiAgbGFicyh0aXRsZSA9ICJIYXVnYWxhbmRldDogSGF1Z2VzdW5kLCBLYXJtw7h5IG9nIFZpbmRhZmpvcmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArDQogICMgQW5naXIgaHZpbGtlIHZhcmlhYmxlciBmYXJnZW5lIHNrYWwgYmFzZXJlIHNlZyBww6UNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICANCiAgIyBMYWdlciBldCBwYW5lbCBzb20gdmlzZXIgZmxlcmUgZ3JhZmVyLCBmb3JkZWx0IHDDpSB0cmUga29sb25uZXINCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsNCiAgDQogICMgQmVzdGVtbWVyIGF0IGZvcmtsYXJpbmdlbmUgc2thbCBzdMOlIHDDpSBow7h5cmUgc2lkZQ0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGF1Z2VsYW5kZXRfNF9NaW5zdGVfQm9zdGVkfQ0KaGxkX2Jvc19sb25nICU+JSANCiAgIyBWaSDDuG5za2VyIMOlIHN0dWRlcmUgYWxsZSBrb21tdW5lbmUgc29tIGZvcm1lbHQgc2V0dCByZWduZXMgc29tIEhhdWdhbGFuZGV0DQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkJva24iLCAiU2F1ZGEiLCAiVHlzdsOmciIsICJVdHNpcmEiKSkgJT4lIA0KICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgDQogIA0KICAjIFZpIG9tZm9ybWF0ZXJlciBkYXRvZW5lIHRpbCBtZXIgZm9ybcOlbHN0amVubGlnZSBmb3JtYXQNCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArDQogIA0KICAjIFZpIHZlbGdlciBodmlsa2VuIGZhcmdlb3Bwc2xhZ3N0YWJlbGwgc29tIHNrYWwgYW52ZW5kZXMNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICAjIEFuZ2lyIGFrc2V0aXRsZXINCiAgbGFicyh0aXRsZSA9ICJIYXVnYWxhbmRldDogQm9rbiwgU2F1ZGEsIFR5c3bDpnIgb2cgVXRzaXJhIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICAjIEFuZ2lyIGh2aWxrZSB2YXJpYWJsZXIgZmFyZ2VuZSBza2FsIGJhc2VyZSBzZWcgcMOlDQogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsNCiAgDQogICMgTGFnZXIgZXQgcGFuZWwgc29tIHZpc2VyIGZsZXJlIGdyYWZlciwgZm9yZGVsdCBww6UgNCBrb2xvbm5lcg0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gNCkgKw0KICANCiAgIyBCZXN0ZW1tZXIgYXQgZm9ya2xhcmluZ2VuZSBza2FsIHN0w6UgcMOlIGjDuHlyZSBzaWRlDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCiMjIFN1bm5ob3JkbGFuZA0KDQpgYGB7ciBCb3N0ZWRfU3VubmhvcmRsYW5kXzF9DQpzdW5fYm9zICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IFRvdGFsdCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkYWxhbmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpDQpgYGANCg0KYGBge3IgQm9zdGVkX1N1bm5ob3JkbGFuZF8yfQ0Kc3lzc2VsX2JvcyAlPiUgDQogIGZpbHRlcihrbnIgJWluJSBjKDQ2MTEsIDQ2MTIsIDQ2MTMsIDQ2MTQsIDQ2MTUsIDQ2MTYsIDQ2MTcpKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBrbmF2biwgY29sb3VyID0ga25hdm4pKSArDQogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsNCiAgIGxhYnModGl0bGUgPSAiU3VubmhvcmRsYW5kIiwgeCA9ICLDhXIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIHN1bl9ib3NfbG9uZ30NCnN1bl9ib3NfbG9uZyA8LSBzeXNzZWxfYm9zICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgOlVvcHBnaXR0LA0KICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLA0KICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfU3VubmhvcmRsYW5kXzNfU3TDuHJzdGVfQm9zdGVkfQ0Kc3VuX2Jvc19sb25nICU+JSANCiAgIyBWaSDDuG5za2VyIMOlIHN0dWRlcmUgYWxsZSBrb21tdW5lbmUgc29tIGZvcm1lbHQgc2V0dCByZWduZXMgc29tIFN1bm5ob3JkbGFuZA0KICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCw7htbG8iLCAiU3RvcmQiLCAiS3Zpbm5oZXJhZCIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSANCiAgDQogICMgVmkgb21mb3JtYXRlcmVyIGRhdG9lbmUgdGlsIG1lciBmb3Jtw6Vsc3RqZW5saWdlIGZvcm1hdA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgDQogICMgVmkgdmVsZ2VyIGh2aWxrZW4gZmFyZ2VvcHBzbGFnc3RhYmVsbCBzb20gc2thbCBhbnZlbmRlcw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogICMgQW5naXIgYWtzZXRpdGxlcg0KICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkbGFuZDogQsO4bWxvLCBLdmlubmhlcmFkIG9nIFN0b3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICAjIEFuZ2lyIGh2aWxrZSB2YXJpYWJsZXIgZmFyZ2VuZSBza2FsIGJhc2VyZSBzZWcgcMOlDQogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsNCiAgDQogICMgTGFnZXIgZXQgcGFuZWwgc29tIHZpc2VyIGZsZXJlIGdyYWZlciwgZm9yZGVsdCBww6UgdHJlIGtvbG9ubmVyDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArDQogIA0KICAjIEJlc3RlbW1lciBhdCBmb3JrbGFyaW5nZW5lIHNrYWwgc3TDpSBww6UgaMO4eXJlIHNpZGUNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpDQpgYGANCg0KYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX1N1bm5ob3JkbGFuZF80X01pbnN0ZV9Cb3N0ZWR9DQpzdW5fYm9zX2xvbmcgJT4lIA0KICAjIFZpIMO4bnNrZXIgw6Ugc3R1ZGVyZSBhbGxlIGtvbW11bmVuZSBzb20gZm9ybWVsdCBzZXR0IHJlZ25lcyBzb20gU3VubmhvcmRsYW5kDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkV0bmUiLCAiU3ZlaW8iLCAiRml0amFyIiwgIlR5c25lcyIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSANCiAgDQogICMgVmkgb21mb3JtYXRlcmVyIGRhdG9lbmUgdGlsIG1lciBmb3Jtw6Vsc3RqZW5saWdlIGZvcm1hdA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgDQogICMgVmkgdmVsZ2VyIGh2aWxrZW4gZmFyZ2VvcHBzbGFnc3RhYmVsbCBzb20gc2thbCBhbnZlbmRlcw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogICMgQW5naXIgYWtzZXRpdGxlcg0KICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkbGFuZDogRXRuZSwgRml0amFyLCBTdmVpbyBvZyBUeXNuZXMiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArDQogICMgQW5naXIgaHZpbGtlIHZhcmlhYmxlciBmYXJnZW5lIHNrYWwgYmFzZXJlIHNlZyBww6UNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICANCiAgIyBMYWdlciBldCBwYW5lbCBzb20gdmlzZXIgZmxlcmUgZ3JhZmVyLCBmb3JkZWx0IHDDpSB0cmUga29sb25uZXINCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDQpICsNCiAgDQogICMgQmVzdGVtbWVyIGF0IGZvcmtsYXJpbmdlbmUgc2thbCBzdMOlIHDDpSBow7h5cmUgc2lkZQ0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQojIyBIYXJkYW5nZXINCg0KYGBge3IgQm9zdGVkX0hhcmRhbmdlcl8xfQ0KaGFyX2JvcyAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBUb3RhbHQpKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJIYXJkYW5nZXIiLCB5PSAiQWxsZSBOw6ZyaW5nZXIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpDQpgYGANCg0KYGBge3IgQm9zdGVkX0hhcmRhbmdlcl8yfQ0Kc3lzc2VsX2JvcyAlPiUgDQogIGZpbHRlcihrbnIgJWluJSBjKDQ2MTgsIDEyMjgpKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBrbmF2biwgY29sb3VyID0ga25hdm4pKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygnIzExMTExMScsJyMwNTQ5ODcnKSkgKw0KICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArDQogICBsYWJzKHRpdGxlID0gIkhhcmRhbmdlciIsIHggPSAiw4VyIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBoYXJfYm9zX2xvbmd9DQpoYXJfYm9zX2xvbmcgPC0gc3lzc2VsX2JvcyAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYDpVb3BwZ2l0dCwNCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwNCiAgICB2YWx1ZXNfdG8gPSAiQW5zYXR0ZSIpDQpgYGANCg0KYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX0hhcmRhbmdlcl9Cb3N0ZWR9DQpoYXJfYm9zX2xvbmcgJT4lIA0KICAjIFZpIMO4bnNrZXIgw6Ugc3R1ZGVyZSBhbGxlIGtvbW11bmVuZSBzb20gZm9ybWVsdCBzZXR0IHJlZ25lcyBzb20gSGFyZGFuZ2VyDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIk9kZGEiLCAiVWxsZW5zdmFuZyIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSANCiAgDQogICMgVmkgb21mb3JtYXRlcmVyIGRhdG9lbmUgdGlsIG1lciBmb3Jtw6Vsc3RqZW5saWdlIGZvcm1hdA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgDQogICMgVmkgdmVsZ2VyIGh2aWxrZW4gZmFyZ2VvcHBzbGFnc3RhYmVsbCBzb20gc2thbCBhbnZlbmRlcw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogICMgQW5naXIgYWtzZXRpdGxlcg0KICBsYWJzKHRpdGxlID0gIkhhcmRhbmdlcjogT2RkYSwgVWxsZW5zdmFuZyIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgIyBBbmdpciBodmlsa2UgdmFyaWFibGVyIGZhcmdlbmUgc2thbCBiYXNlcmUgc2VnIHDDpQ0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIA0KICAjIExhZ2VyIGV0IHBhbmVsIHNvbSB2aXNlciBmbGVyZSBncmFmZXIsIGZvcmRlbHQgcMOlIHRyZSBrb2xvbm5lcg0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKw0KICANCiAgIyBCZXN0ZW1tZXIgYXQgZm9ya2xhcmluZ2VuZSBza2FsIHN0w6UgcMOlIGjDuHlyZSBzaWRlDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCiMgT3BwZ2F2ZSA0DQoNCmBgYHtyIFBlbmRsaW5nIHDDpSBIYXVnYWxhbmRldH0NCmhnbF9QZW5kbGluZw0KYGBgDQoNCmBgYHtyIFBlbmRsaW5nIGkgU3VubmhvcmRsYW5kfQ0Kc3VuX1BlbmRsaW5nDQpgYGANCg0KLSAgIA0KDQpgYGB7ciBzaXN0ZX0NCiMgU2lzdGUNCmBgYA0KDQotICAgDQo=
=======
LS0tCnRpdGxlOiAiQXJiZWlkc2tyYXYgdsOlcmVuIDIwMjIiCmF1dGhvcjoKLSBLZXZpbiBIYQotIE9sYSBBbmRyZSBPbG9mc3NvbgotIEFubiBFbGlzYWJldGggSmFjb2JzZW4KLSBIZWlkaSBNYXJpZSBSb2xmc25lcwpzdWJ0aXRsZTogTVNCMTA2LCBBbnZlbmR0IGJ5LSBvZyByZWdpb25hbMO4a29ub21pCm91dHB1dDoKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZApsYW5nOiBuby1OQgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkocmVhZHIpCiAgbGlicmFyeShnZ3Bsb3QyKQogIGxpYnJhcnkoa25pdHIpCiAgbGlicmFyeSh2aXJpZGlzKQogIGxpYnJhcnkodGlkeXZlcnNlKQogIH0pCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPUZBTFNFLCBpbmNsdWRlID0gVFJVRSkKYGBgCgojIElubmxlc2luZyBhdiAuY3N2IGZpbGVyCgpgYGB7ciBjc3ZfZmlsZXJ9CnN5c3NlbF9hcmIgPC0gcmVhZF9jc3YoIkRhdGEvc3lzc2VsX2FyYi5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpobGRfYXJiIDwtIHJlYWRfY3N2KCJEYXRhL2hsZF9hcmIuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKc3VuX2FyYiA8LSByZWFkX2NzdigiRGF0YS9zdW5fYXJiLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmhhcl9hcmIgPC0gcmVhZF9jc3YoIkRhdGEvaGFyX2FyYi5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpzeXNzZWxfYm9zIDwtIHJlYWRfY3N2KCJEYXRhL3N5c3NlbF9ib3MuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKaGxkX2JvcyA8LSByZWFkX2NzdigiRGF0YS9obGRfYm9zLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCnN1bl9ib3MgPC0gcmVhZF9jc3YoIkRhdGEvc3VuX2Jvcy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpoYXJfYm9zIDwtIHJlYWRfY3N2KCJEYXRhL2hhcl9ib3MuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKYGBgCgojIDEgU3lzc2Vsc2V0dGluZyBJIFVsaWtlIE7DpnJpbmdlciwgRXR0ZXIgQXJiZWlkc3N0ZWQgKE1vZGVsbGVyIEZlcmRpZz8/KQoKIyMgSGF1Z2FsYW5kZXQKCmBgYHtyIEFyYmVpZHNzdGVkX0hhdWdhbGFuZGV0XzF9CmhsZF9hcmIgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBUb3RhbHQpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiSGF1Z2FsYW5kZXQiKSsKICB5bGFiKCJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkKYGBgCgpgYGB7ciBBcmJlaWRzc3RlZF9IYXVnYWxhbmRldF8yfQpzeXNzZWxfYXJiICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYygxMTA2LCAxMTM1LCAxMTQ1LCAxMTQ2LCAxMTQ5LCAxMTUxLCAxMTYwKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBgQWxsZSBOw6ZyaW5nZXJgLCAoYW5nbGU9MCkpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBrbmF2biwgY29sb3VyID0ga25hdm4pKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYyhzZXEoMi4wLCAyLCBieSA9IC0wLjEpKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0IiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIGkgIFxuIGFsbGUgbsOmcmluZ2VyIikgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgaGxkX2FyYl9sb25nfQpobGRfYXJiX2xvbmcgPC0gc3lzc2VsX2FyYiAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWA6VW9wcGdpdHQsCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwKICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikKYGBgCgoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX0hhdWdlbGFuZGV0XzNfU3TDuHJzdGVfQXJiZWlkc3N0ZWR9CmhsZF9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiSGF1Z2VzdW5kIiwgIkthcm3DuHkiLCAiVmluZGFmam9yZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0OiBIYXVnZXN1bmQsIEthcm3DuHkgb2cgVmluZGFmam9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGF1Z2VsYW5kZXRfNF9NaW5zdGVfQXJiZWlkc3N0ZWR9CmhsZF9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQm9rbiIsICJTYXVkYSIsICJUeXN2w6ZyIiwgIlV0c2lyYSIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0OiBCb2tuLCBTYXVkYSwgVHlzdsOmciBvZyBVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSA0KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgSGF1Z2VzdW5kfQpzeXNzZWxfYXJiICU+JQogIGZpbHRlcihrbnIgPT0gMTEwNikgJT4lCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJIYXVnZXN1bmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMjA4NTIsIDIyMTkwKSwgeGxpbSA9IGMoKSkKYGBgCgpgYGB7ciBTYXVkYX0Kc3lzc2VsX2FyYiAlPiUKICBmaWx0ZXIoa25yID09IDExMzUpICU+JQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiU2F1ZGEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMTkzNywgMjE4MCksIHhsaW0gPSBjKCkpCmBgYAoKYGBge3IgQm9rbn0Kc3lzc2VsX2FyYiAlPiUKICBmaWx0ZXIoa25yID09IDExNDUpICU+JQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiQm9rbiIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMjkxLCAzMjcpLCB4bGltID0gYygpKQpgYGAKCmBgYHtyIFR5c3bDpnJ9CnN5c3NlbF9hcmIgJT4lCiAgZmlsdGVyKGtuciA9PSAxMTQ2KSAlPiUKIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIlR5c3bDpnIiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDQwNDgsIDQ3NzMpLCB4bGltID0gYygpKQpgYGAKCmBgYHtyIEthcm3DuHl9CnN5c3NlbF9hcmIgJT4lCiAgZmlsdGVyKGtuciA9PSAxMTQ5KSAlPiUKIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkthcm3DuHkiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDE0NTkxLCAxNjA1OSksIHhsaW0gPSBjKCkpCmBgYAoKYGBge3IgVXRzaXJhfQpzeXNzZWxfYXJiICU+JQogIGZpbHRlcihrbnIgPT0gMTE1MSkgJT4lCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDg4LCAxMTQpLCB4bGltID0gYygpKQpgYGAKCmBgYHtyIFZpbmRhZmpvcmR9CnN5c3NlbF9hcmIgJT4lCiAgZmlsdGVyKGtuciA9PSAxMTYwKSAlPiUKIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIlZpbmRhZmpvcmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDQ0MjIsIDUwMzcpLCB4bGltID0gYygpKQpgYGAKCiMjIFN1bm5ob3JkbGFuZAoKU8OlIGdqZXIgdmkgZGV0IHNhbW1lIGZvciAqU3VubmhvcmRsYW5kKgoKYGBge3J9CnN1bl9hcmIgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBUb3RhbHQpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiU3VubmhvcmRhbGFuZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpCmBgYAoKCmBgYHtyIEFyYmVpZHNzdGVkX1N1bm5ob3JkbGFuZH0Kc3lzc2VsX2FyYiAlPiUgCiAgZmlsdGVyKGtuciAlaW4lIGMoNDYxMSwgNDYxMiwgNDYxMywgNDYxNCwgNDYxNSwgNDYxNiwgNDYxNykpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkbGFuZCIsIHggPSAiw4VyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIHN1bl9hcmJfbG9uZ30Kc3VuX2FyYl9sb25nIDwtIHN5c3NlbF9hcmIgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgOlVvcHBnaXR0LAogICAgbmFtZXNfdG8gPSAiTsOmcmluZyIsCiAgICB2YWx1ZXNfdG8gPSAiQW5zYXR0ZSIpCmBgYAoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX1N1bm5ob3JkbGFuZF8zX1N0w7hyc3RlX0FyYmVpZHNzdGVkfQpzdW5fYXJiX2xvbmcgJT4lIAogIGZpbHRlcihrbmF2biAlaW4lIGMoIkLDuG1sbyIsICJTdG9yZCIsICJLdmlubmhlcmFkIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiU3VubmhvcmRsYW5kOiBCw7htbG8sIEt2aW5uaGVyYWQgb2cgU3RvcmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX1N1bm5ob3JkbGFuZF80X01pbnN0ZV9BcmJlaWRzc3RlZH0Kc3VuX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJFdG5lIiwgIlN2ZWlvIiwgIkZpdGphciIsICJUeXNuZXMiKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgbGFicyh0aXRsZSA9ICJTdW5uaG9yZGxhbmQ6IEV0bmUsIEZpdGphciwgU3ZlaW8gb2cgVHlzbmVzIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gNCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIEV0bmV9CnN5c3NlbF9hcmIgJT4lCiAgZmlsdGVyKGtuciA9PSA0NjExKSAlPiUKIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkV0bmUiLCB4ID0gIsOFciIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDE2MTMsIDE3NzUpLCB4bGltID0gYygpKQpgYGAKCmBgYHtyIFN2ZWlvfQpzeXNzZWxfYXJiICU+JQogIGZpbHRlcihrbnIgPT0gNDYxMikgJT4lCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJTdmVpbyIsIHggPSAiw4VyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMTM1NywgMTUyMyksIHhsaW0gPSBjKCkpCmBgYAoKYGBge3IgQsO4bWxvfQpzeXNzZWxfYXJiICU+JQogIGZpbHRlcihrbnIgPT0gNDYxMykgJT4lCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJCw7htbG8iLCB4ID0gIsOFciIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDQ2NjIsIDQ4OTApLCB4bGltID0gYygpKQpgYGAKCmBgYHtyIFN0b3JkfQpzeXNzZWxfYXJiICU+JQogIGZpbHRlcihrbnIgPT0gNDYxNCkgJT4lCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJTdG9yZCIsIHggPSAiw4VyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoOTE2MSwgOTkzOCksIHhsaW0gPSBjKCkpCmBgYAoKYGBge3IgRml0amFyfQpzeXNzZWxfYXJiICU+JQogIGZpbHRlcihrbnIgPT0gNDYxNSkgJT4lCiBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJGaXRqYXIiLCB4ID0gIsOFciIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDEwODUsIDEyNTkpLCB4bGltID0gYygpKQpgYGAKCmBgYHtyIFR5c25lc30Kc3lzc2VsX2FyYiAlPiUKICBmaWx0ZXIoa25yID09IDQ2MTYpICU+JQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiVHlzbmVzIiwgeCA9ICLDhXIiKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyg5ODksIDExODgpLCB4bGltID0gYygpKQpgYGAKCmBgYHtyIEt2aW5uaGVyYWR9CnN5c3NlbF9hcmIgJT4lCiAgZmlsdGVyKGtuciA9PSA0NjE3KSAlPiUKIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkt2aW5uaGVyYWQiLCB4ID0gIsOFciIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDU0NzIsIDYwODQpLCB4bGltID0gYygpKQpgYGAKCiMjIEhhcmRhbmdlcgoKVGlsIHNsdXR0IG3DpSB2aSBnamVyZSBkZXQgc2FtbWUgbWVkICpIYXJkYW5nZXIqCgpgYGB7ciBBcmJlaWRzc3RlZF9IYXJkYW5nZXJfMX0KaGFyX2FyYiAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IFRvdGFsdCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJIYXJkYW5nZXIiLCB5PSAiQWxsZSBOw6ZyaW5nZXIiKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkKYGBgCgpgYGB7ciBBcmJlaWRzc3RlZF9IYXJkYW5nZXJfMn0Kc3lzc2VsX2FyYiAlPiUgCiAgZmlsdGVyKGtuciAlaW4lIGMoNDYxOCwgMTIyOCkpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyMxMTExMTEnLCcjMDU0OTg3JykpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogICBsYWJzKHRpdGxlID0gIkhhcmRhbmdlciIsIHggPSAiw4VyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIGhhcl9hcmJfbG9uZ30KaGFyX2FyYl9sb25nIDwtIHN5c3NlbF9hcmIgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgOlVvcHBnaXR0LAogICAgbmFtZXNfdG8gPSAiTsOmcmluZyIsCiAgICB2YWx1ZXNfdG8gPSAiQW5zYXR0ZSIpCmBgYAoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX0hhcmRhbmdlcl9BcmJlaWRzc3RlZH0KaGFyX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJPZGRhIiwgIlVsbGVuc3ZhbmciKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgbGFicyh0aXRsZSA9ICJIYXJkYW5nZXI6IE9kZGEsIFVsbGVuc3ZhbmciLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgT2RkYX0Kc3lzc2VsX2FyYiAlPiUKICBmaWx0ZXIoa25yID09IDEyMjgpICU+JQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiT2RkYSIsIHggPSAiw4VyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMzQ4OSwgMzc0MCksIHhsaW0gPSBjKCkpCmBgYAoKYGBge3IgVWxsZW5zdmFuZ30Kc3lzc2VsX2FyYiAlPiUKICBmaWx0ZXIoa25yID09IDQ2MTgpICU+JQogZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiVWxsZW5zdmFuZyIsIHggPSAiw4VyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMTIzNSwgNTI5MSksIHhsaW0gPSBjKCkpCmBgYAoKIyAzIFN5c3NlbHNldHRpbmcgSSBVbGlrZSBOw6ZyaW5nZXIsIEV0dGVyIEJvc3RlZCAoTW9kZWxsZXIgVW5kZXIgQXJiZWlkKQoKIyMgSGF1Z2FsYW5kZXQKCmBgYHtyIEJvc3RlZF9IYXVnYWxhbmRldF8xfQpobGRfYm9zICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gw4VyLCB5ID0gVG90YWx0KSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0IikrCiAgeWxhYigiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpCmBgYAoKYGBge3IgQm9zdGVkX0hhdWdhbGFuZGV0XzJ9CnN5c3NlbF9ib3MgJT4lIAogIGZpbHRlcihrbnIgJWluJSBjKDExMDYsIDExMzUsIDExNDUsIDExNDYsIDExNDksIDExNTEsIDExNjApKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IGBBbGxlIE7DpnJpbmdlcmAsIChhbmdsZT0wKSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGxhYnModGl0bGUgPSAiSGF1Z2FsYW5kZXQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpgYGB7ciBobGRfYm9zX2xvbmd9CmhsZF9ib3NfbG9uZyA8LSBzeXNzZWxfYm9zICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYDpVb3BwZ2l0dCwKICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLAogICAgdmFsdWVzX3RvID0gIkFuc2F0dGUiKQpgYGAKCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19IYXVnZWxhbmRldF8zX1N0w7hyc3RlX0Jvc3RlZH0KaGxkX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJIYXVnZXN1bmQiLCAiS2FybcO4eSIsICJWaW5kYWZqb3JkIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiSGF1Z2FsYW5kZXQ6IEhhdWdlc3VuZCwgS2FybcO4eSBvZyBWaW5kYWZqb3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19IYXVnZWxhbmRldF80X01pbnN0ZV9Cb3N0ZWR9CmhsZF9ib3NfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQm9rbiIsICJTYXVkYSIsICJUeXN2w6ZyIiwgIlV0c2lyYSIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0OiBCb2tuLCBTYXVkYSwgVHlzdsOmciBvZyBVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSA0KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKIyMgU3VubmhvcmRsYW5kCgpgYGB7ciBCb3N0ZWRfU3VubmhvcmRsYW5kXzF9CnN1bl9ib3MgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBUb3RhbHQpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiU3VubmhvcmRhbGFuZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpCmBgYAoKCmBgYHtyIEJvc3RlZF9TdW5uaG9yZGxhbmRfMn0Kc3lzc2VsX2JvcyAlPiUgCiAgZmlsdGVyKGtuciAlaW4lIGMoNDYxMSwgNDYxMiwgNDYxMywgNDYxNCwgNDYxNSwgNDYxNiwgNDYxNykpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkbGFuZCIsIHggPSAiw4VyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIHN1bl9ib3NfbG9uZ30Kc3VuX2Jvc19sb25nIDwtIHN5c3NlbF9ib3MgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgOlVvcHBnaXR0LAogICAgbmFtZXNfdG8gPSAiTsOmcmluZyIsCiAgICB2YWx1ZXNfdG8gPSAiQW5zYXR0ZSIpCmBgYAoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX1N1bm5ob3JkbGFuZF8zX1N0w7hyc3RlX0Jvc3RlZH0Kc3VuX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCw7htbG8iLCAiU3RvcmQiLCAiS3Zpbm5oZXJhZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkbGFuZDogQsO4bWxvLCBLdmlubmhlcmFkIG9nIFN0b3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19TdW5uaG9yZGxhbmRfNF9NaW5zdGVfQm9zdGVkfQpzdW5fYm9zX2xvbmcgJT4lIAogIGZpbHRlcihrbmF2biAlaW4lIGMoIkV0bmUiLCAiU3ZlaW8iLCAiRml0amFyIiwgIlR5c25lcyIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkbGFuZDogRXRuZSwgRml0amFyLCBTdmVpbyBvZyBUeXNuZXMiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSA0KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKIyMgSGFyZGFuZ2VyCgpgYGB7ciBCb3N0ZWRfSGFyZGFuZ2VyXzF9Cmhhcl9ib3MgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBUb3RhbHQpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiSGFyZGFuZ2VyIiwgeT0gIkFsbGUgTsOmcmluZ2VyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpCmBgYAoKYGBge3IgQm9zdGVkX0hhcmRhbmdlcl8yfQpzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYyg0NjE4LCAxMjI4KSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0ga25hdm4sIGNvbG91ciA9IGtuYXZuKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygnIzExMTExMScsJyMwNTQ5ODcnKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgIGxhYnModGl0bGUgPSAiSGFyZGFuZ2VyIiwgeCA9ICLDhXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgaGFyX2Jvc19sb25nfQpoYXJfYm9zX2xvbmcgPC0gc3lzc2VsX2JvcyAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWA6VW9wcGdpdHQsCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwKICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikKYGBgCgpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGFyZGFuZ2VyX0Jvc3RlZH0KaGFyX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJPZGRhIiwgIlVsbGVuc3ZhbmciKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgbGFicyh0aXRsZSA9ICJIYXJkYW5nZXI6IE9kZGEsIFVsbGVuc3ZhbmciLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKCi0KYGBge3Igc2lzdGV9CiMgU2lzdGUKYGBgCgotCg==
>>>>>>> 1f60758af80b25c08178fcb759dd6a309b652257